package br.gov.ms.tce.modelo.bean;



import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;


/**
*  @class Endereco
 * @author Anderson Paulino
 * @date 27/05/2011
 *
 */
@Entity
@Table( schema = "comum", name = "endereco")
public class Endereco implements java.io.Serializable {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = -4687676794871255067L;
	
	/**
	 * id
	 */
	private EnderecoId id;
	
	/**
	 * municipio: Cidade
	 */
	private Municipio municipio;	
	
	/**
	 * pessoa: Pessoa que reside no endereço
	 */
	private Pessoa pessoa;
	
	/**
	 * uf: estado
	 */
	private Uf uf;
	
	/**
	 * logradouro: Logradouro, rua, travessia, etc...
	 */
	private String logradouro;
	
	/**
	 * numero: Número da casa
	 */
	private Integer numero;
	
	/**
	 * bairro: Bairro
	 */
	private String bairro;
	
	/**
	 * cep: CEP
	 */
	private String cep;
	
	/**
	 * padrao: Verdadeiro se for o endereço padrão da pessoa.
	 */
	private boolean padrao;
	
	/**
	 * complemento: Complemento
	 */
	private String complemento;
	
	
	/**
	 * tipoEndereco
	 */
	private TipoEnderecoEnum tipoEndereco;
	

	/**
	 * Construtor Padrão
	 */
	public Endereco() {
	}

	/**
	 * Construtor Padrão
	 * @param municipio
	 * @param ctPessoa
	 * @param uf
	 * @param endLog
	 * @param endBai
	 * @param endCep
	 * @param endPad
	 */
	public Endereco(Municipio municipio, 
			Pessoa ctPessoa, Uf uf, String endLog, String endBai,
			String endCep, boolean endPad) {
		this.municipio = municipio;	
		this.pessoa = ctPessoa;
		this.uf = uf;
		this.logradouro = endLog;
		this.bairro = endBai;
		this.cep = endCep;
		this.padrao = endPad;
	}


	/**
	 * @return Obtém o identificador do endereço
	 */
	@EmbeddedId
	@AttributeOverrides({
			@AttributeOverride(name = "codPessoa", column = @Column(name = "cod_pessoa", nullable = false)),
			@AttributeOverride(name = "codTipoEndereco", column = @Column(name = "cod_tipo_endereco", nullable = false)) })
	public EnderecoId getId() {
		return this.id;
	}

	/**
	 * @param Configura o identificador do endereço
	 */
	public void setId(EnderecoId id) {
		this.id = id;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "cod_municipio", nullable = false)
	public Municipio getMunicipio() {
		return this.municipio;
	}

	public void setMunicipio(Municipio municipio) {
		this.municipio = municipio;
	}

	
	

	/**
	 * @return Obtém o valor da propriedade pessoa
	 */
	@ManyToOne
	@JoinColumn(name = "cod_pessoa", nullable = false, insertable=false, updatable=false)
	public Pessoa getPessoa() {
		return pessoa;
	}

	/**
	 * @param pessoa configura a propriedade pessoa
	 */
	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}

	@ManyToOne
	@JoinColumn(name = "cod_uf", nullable = false)
	public Uf getUf() {
		return this.uf;
	}

	public void setUf(Uf uf) {
		this.uf = uf;
	}

	/**
	 * @return Obtém o valor da propriedade logradouro
	 */
	public String getLogradouro() {
		return logradouro;
	}

	/**
	 * @param logradouro configura a propriedade logradouro
	 */
	public void setLogradouro(String logradouro) {
		this.logradouro = logradouro;
	}

	/**
	 * @return Obtém o valor da propriedade numero
	 */
	public Integer getNumero() {
		return numero;
	}

	/**
	 * @param numero configura a propriedade numero
	 */
	public void setNumero(Integer numero) {
		this.numero = numero;
	}

	/**
	 * @return Obtém o valor da propriedade bairro
	 */
	public String getBairro() {
		return bairro;
	}

	/**
	 * @param bairro configura a propriedade bairro
	 */
	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

	/**
	 * @return Obtém o valor da propriedade cep
	 */
	public String getCep() {
		return cep;
	}

	/**
	 * @param cep configura a propriedade cep
	 */
	public void setCep(String cep) {
		this.cep = cep;
	}

	/**
	 * @return Obtém o valor da propriedade padrao
	 */
	public boolean isPadrao() {
		return padrao;
	}

	/**
	 * @param padrao configura a propriedade padrao
	 */
	public void setPadrao(boolean padrao) {
		this.padrao = padrao;
	}

	/**
	 * @return Obtém o valor da propriedade complemento
	 */
	public String getComplemento() {
		return complemento;
	}

	/**
	 * @param complemento configura a propriedade complemento
	 */
	public void setComplemento(String complemento) {
		this.complemento = complemento;
	}

	/**
	 * @return Obtém o valor da propriedade tipoEndereco
	 */
	@Enumerated
	@Column(name="cod_tipo_endereco", insertable=false, updatable=false)
	public TipoEnderecoEnum getTipoEndereco() {
		return tipoEndereco;
	}

	/**
	 * @param tipoEndereco configura a propriedade tipoEndereco
	 */
	public void setTipoEndereco(TipoEnderecoEnum tipoEndereco) {
		this.tipoEndereco = tipoEndereco;
	}
	
	
	
}
